package arithmetic;

import org.junit.jupiter.api.Test;

/**
 * 罗马数字：将罗马数字转换为 10 进制 int
 *
 * @author gaojie
 * @date 2022-02-24
 */
public class RomanNumerals {

    @Test
    void test() {
        assert romanToInt("III") == 3;
        assert romanToInt("IV") == 4;
        assert romanToInt("IX") == 9;
        assert romanToInt("LVIII") == 58;
        assert romanToInt("LX") == 60;
        assert romanToInt("CX") == 110;
        assert romanToInt("MCMXCIV") == 1994;
    }

    /**
     * 1.转换为数组遍历
     * 2.若当前值大于前一个，则说明需要减去前一个；否则，当前值要加入计算
     * 3.若当前为最后一个元素，则也将其值加入，计算完成；否则暂存上一个数的值
     */
    private int romanToInt(String roman) {
        int sum = 0, before = 0;
        char[] chars = roman.toCharArray();
        int length = chars.length;
        for (int i = 0; i < length; i++) {
            int cur = getInt(chars[i]);

            // 若当前值大于前一个，则说明需要减去前一个；否则，当前值要加入计算
            if (before != 0 && cur > before) {
                sum -= before;
            } else {
                sum += before;
            }

            // 若当前为最后一个元素，则也将其值加入，计算完成；否则暂存上一个数的值
            if (i == length - 1) {
                sum += cur;
            } else {
                before = cur;
            }
        }
        System.out.printf("%s = %d%n", roman, sum);
        return sum;
    }

    /**
     * 罗马数字和 int 的映射规则
     */
    int getInt(char c) {
        switch (c) {
            case 'I':
                return 1;
            case 'V':
                return 5;
            case 'X':
                return 10;
            case 'L':
                return 50;
            case 'C':
                return 100;
            case 'D':
                return 500;
            default:
                return 1000;
        }
    }

}
